來到第四天,今天會聚焦在 Spring Boot 註冊類別的方式。
Spring Framework 提供 3 種註冊 Bean 的方式 ,
Java-based configuration\XML-based configuration\Annotation-based configuration,
雖然 Spring Boot 可以支援 XML 註冊,但官方推薦還是以 Java-based 為主。
同時官方建議透過 @Configuration 標籤標註主要的註冊資源,再透過 @Import 標籤去補充額外的註冊類別又或是透過 @ComponentScan 去自動選取所有 Spring Components ,這其中包含 @Configuration 標註主要的註冊類別。
下方為一個 Java Based Configuration 的例子,
會有一個主要註冊Bean 的檔案(標有 @Configuration ) 以及另一個註冊Bean的副檔案,透過@Import 將副檔案 import 進去主要的註冊檔案之中。
主要註冊檔案( @Configuration 所標注的類別)
package com.example.officialdocch6.configuration;
import com.example.officialdocch6.model.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(OtherConfig.class)
public class MyConfiguration {
/**
在此註冊一個 Dog類別的Bean,Spring 會採用方法名作為 Bean Name,
此處範例就是以 myDog 作為 Bean Name
*/
@Bean
public Dog myDog() {
return new Dog("Hot Dog");
}
}
其他需要註冊Bean的副檔案
package com.example.officialdocch6.configuration;
import com.example.officialdocch6.model.Cat;
import org.springframework.context.annotation.Bean;
//注意這個類別除了@Bean之外,並無其他標籤
public class OtherConfig {
@Bean
public Cat myCat() {
return new Cat("Kitty");
}
}
想將Java類別 Cat 註冊成一個 Spring Bean
import lombok.extern.slf4j.Slf4j;//打印log用的類別
@Slf4j
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public void meo() {
log.info(this.name + " meow ~~");
}
}
同樣想註冊成 Bean 的 Java 類別 Dog
package com.example.officialdocch6.model;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Dog {
private String name;
public Dog(String name) {
this.name = name;
}
public void spark() {
log.info(this.name + " spark~");
}
}
在入口檢驗(標有main方法的類別)驗證是否有成功註冊Bean
package com.example.officialdocch6;
import com.example.officialdocch6.model.Cat;
import com.example.officialdocch6.model.Dog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@Slf4j
@SpringBootApplication
public class OfficialDocCh6Application {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(OfficialDocCh6Application.class, args);
Dog doggy = (Dog) applicationContext.getBean("myDog");
Cat kitty = (Cat) applicationContext.getBean("myCat");
doggy.spark();
kitty.meo();
}
}
從Console log 之中看到註冊Dog 、Cat 有成功
參考資料
Spring Boot 官方文件
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using.configuration-classes